package main

import (
	"fmt"
	"math"
	"sort"
	"strconv"
)

type Areaer interface {
	Area() float64
}

func area(a Areaer) float64 {
	return a.Area()
}

// 几何
type Geometry struct {
	name string
	area float64
}

var Geometrys []Geometry

func NewGeometry() *Geometry {
	return &Geometry{}
}

// 各面积排序
func (Geometry) GeometrySort(gm map[string]float64) {
	for k, v := range gm {
		Geometrys = append(Geometrys, Geometry{k, v})
	}
	sort.Slice(Geometrys, func(i, j int) bool {
		return Geometrys[i].area > Geometrys[j].area
	})
	for _, v := range Geometrys {
		fmt.Printf("%v\n", v)
	}
}

// 圆形
type Rotundity struct {
	Radius float64 // 半径
}

// 圆形构造函数
func NewRotundity() *Rotundity {
	return &Rotundity{}
}

// 圆形面积计算
func (r *Rotundity) Area() float64 {
	if r.Radius <= 0 {
		return 0
	}
	return math.Pi * math.Pow(r.Radius, 2)
}

// 三角形
type Triangle struct {
	High   float64 // 高
	Botton float64 // 底
}

// 三角形构造函数
func NewTriangle() *Triangle {
	return &Triangle{}
}

// 三角形面积计算
func (t *Triangle) Area() float64 {
	if t.High <= 0 || t.Botton <= 0 {
		return 0
	}
	return t.High * t.Botton / 2
}

// 长方形
type Rectangle struct {
	Long  float64 // 长
	Width float64 // 宽
}

// 长方形构造函数
func NewRectangle() *Rectangle {
	return &Rectangle{}
}

// 长方形面积计算
func (r *Rectangle) Area() float64 {
	if r.Width <= 0 || r.Long < 0 {
		return 0
	}
	return r.Long * r.Width
}

// 求面积后保留后4位
func strToFloat64(f float64) float64 {
	v, err := strconv.ParseFloat(fmt.Sprintf("%.4f", f), 64)
	if err != nil {
		panic("转换出错")
	}
	return v
}

func main() {

	// 第1题 实现对圆形、三角形、长方形求面积
	rotundity := NewRotundity()
	rotundity.Radius = 4
	r := strToFloat64(area(rotundity))
	fmt.Println("圆形面积:", r)

	triangle := NewTriangle()
	triangle.High = 9.45
	triangle.Botton = 13.33
	t := strToFloat64(area(triangle))
	fmt.Println("三角形面积:", t)

	rectangle := NewRectangle()
	rectangle.Long = 2.3
	rectangle.Width = 30.4
	rec := strToFloat64(area(rectangle))
	fmt.Println("长方形面积:", rec)

	// 第2题 利用第1题，构造3个以上图形，至少圆形、三角形、矩形各有一个，对上题的图形按照面积降序排列
	gsMap := map[string]float64{"圆形面积": r, "三角形面积": t, "长方形面积": rec}
	gs := NewGeometry()
	gs.GeometrySort(gsMap)
}
